/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package saa.controller;

import java.util.Properties;
import java.util.Random;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import lib.BCrypt;
import saa.dao.usuario.UsuarioDAOInterface;
import saa.dominio.usuario.Usuario;

/**
 *
 * @author lobao
 */
@ManagedBean(name = "login")
@SessionScoped
public class LoginController {

    static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static Random rnd = new Random();

    private String email;

    private String nome;

    private String senha;

    private Usuario usuario;

    @EJB
    private UsuarioDAOInterface usuarioDAO;

    public String autenticar() {
        this.usuario = usuarioDAO.buscar(email);
        if (usuario != null) {
            if (usuario.getSenha().compareTo(BCrypt.hashpw(this.senha, usuario.getSalt())) == 0) {
                return "ok";
            } else {
                FacesContext.getCurrentInstance().addMessage("login:senhaIncorreta", new FacesMessage("A senha digitada está incorreta."));
                return "";
            }

        } else {
            FacesContext.getCurrentInstance().addMessage("login:emailInexistente", new FacesMessage("O email fornecido não está cadastrado."));
            return "";

        }
    }

    public String cadastrar() {
        try {
            String salt = BCrypt.gensalt();
            this.usuario = usuarioDAO.adicionar(new Usuario(this.nome, this.email, BCrypt.hashpw(this.senha, salt), salt));

            if (usuario != null) {

                Session session = getSessaoEmail();
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("saa.teste@gmail.com"));

                message.setRecipients(Message.RecipientType.TO,
                        InternetAddress.parse(usuario.getEmail()));

                message.setSubject("Bem vindo ao SAA!");
                message.setText("Olá " + usuario.getNome() + ", seja bem-vindo e bom proveito!");

                Transport.send(message);

                return "cadastro-ok";
            } else {
                FacesContext.getCurrentInstance().addMessage("cadastro:emailJaExiste", new FacesMessage("O email ja possui cadastro no sistema."));
                return "";
            }
        } catch (MessagingException e) {
            return "";
        }
    }

    private Session getSessaoEmail() {
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");

        return Session.getInstance(props,
                new javax.mail.Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("saa.teste@gmail.com", "SAAtestePDS");
                    }
                });
    }

    public String enviarSenha() {

        Session session = getSessaoEmail();

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("saa.teste@gmail.com"));

            this.usuario = usuarioDAO.buscar(email);

            if (usuario != null) {
                message.setRecipients(Message.RecipientType.TO,
                        InternetAddress.parse(usuario.getEmail()));

                String senha = "";

                for (int i = 0; i < 32; i++) {
                    senha += AB.charAt(rnd.nextInt(AB.length()));
                }

                usuario.setSenha(BCrypt.hashpw(senha, usuario.getSalt()));
                usuarioDAO.atualizar(usuario);

                message.setSubject("Sua nova senha no SAA");
                message.setText("Sua nova senha é: " + senha);

                Transport.send(message);
                FacesContext.getCurrentInstance().addMessage("login:senhaEnviada", new FacesMessage("Sua nova senha foi enviada para o email fornecido."));
                return "ok";
            } else {
                FacesContext.getCurrentInstance().addMessage("nova-senha:emailInexistente", new FacesMessage("O email fornecido não está cadastrado."));
                return "";
            }
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
